原始表达式
直接量
直接量是直接在程序中出现的常数值
关键字
JavaScript的一些保留字构成了原始表达式
变量
|
|
对象和数组的初始化表达式
数组初始化表达式
|
|
数组直接量中列表逗号之间的元素可以忽略,这时省略的空位会填充值undefined,例如,下面数组包含5个元素,其中三个元素是undefined
数组直接量的元素列表结尾处可以留下单个逗号,这时并不会创建一个新的值为undefined的元素
对象初始化表达式
|
|
函数定义表达式
某种意义上讲,函数定义表达式可称为“函数直接量”
对象创建表达式
对象创建表达式创建一个对象并调用一个函数(这个函数称之为构造函数)初始化新的对象的属性
运算符
运算顺序
假设存在a=1 那么“b=(a++)+a”的计算顺序为
1) 计算b
2) 计算a++(假设值为c)
3) 计算a
4) 计算c+a
5) 将c+a的结果赋值给b
根据“+”运算符的定义 第2)步中的a++的结果依然是1,即C为1,随后a立即自增1,随后在进行第3)步计算a值时,a的值已经是2,所以b的值为3
“+”运算符
“+”号运算符的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,“+”运算符将进行字符串连接操作,如果两个操作数都不是类字符串,那么僵进行算数加法运算
一元加法
把操作数转换为数字(或者NaN),并返回这个转换后的数字,如果操作数本身就是数字,则直接返回这个数字
一元减法
把操作数转换为数字,然后改变运算结果的符号
相等运算符
检测两个操作数是否相等,可以允许进行类型转换
- 如果一个值为null另一个是undefined,则它们相等
- 如果一个值是数字,另一个字符串,则先将字符串转换为数字,然后进行比较
- 如果其中一个值是true,则将其转换为1再进行比较,如果其中一个值是false,则将其转换为0再进行比较
- 如果一个值是对象,另外一个值是数字,则对象通过toString()或者valueOf()转换为原始值再进行比较
- javaScript核心内置类会首先用valueOf(),再用toString(),但日期类除外,日期类只使用toString()
严格相等运算符
检测两个操作数是否严格相等,不允许进行任何转换
- 如果两个值类型不相同,则他们不相等
- 如果两个值都是null或者undefined,则他们不相等
- 如果两个值都是布尔值true或者false,则他们相等
- 如果其中一个值时NaN或者两个操作数都是NaN,则他们不相等。
- NaN与任何值都不相等,包括它本身。通过X!==X只有在x为NaN的时候,这个表达式才会为true
- 如果两个值为数字且数值相等,则它们相等。如果一个值为0,另一个值为-0,则他们同样相等
比较运算符
对于数字和字符串操作符来说,加号运算符和比较运算符的行为都有所不同,加号运算符更加偏向于字符串,如果他的其中一个操作数是字符串的话,则进行字符串连接操作,而比较运算符更偏爱数字,只有在两个操作数都是字符串的时候,才会进行字符串比较
in运算符
in运算符希望它的左操作数是一个字符串或者可以转换位一个字符串,希望它的右操作数是一个对象,如果右侧的对象拥有一个名为左操作数值得属性名,则返回true,注意继承的属性也会返回true。
instanceof 运算符
instanceof运算符希望左操作数是一个对象,右操作数是一个标识对象的类(构造函数),如果左侧的对象时右侧类的实例,则返回true。
如果instanceof的左操作数不是对象的话,instanceof返回false。如果右操作数不是函数,则跑出一个类型错误异常